package top.xia17.plugins.fast.common.database;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数据库工具
 *
 * @author xia17
 * @date 2021/11/25
 */
@Slf4j
public class DbUtil {

    private static final Pattern JDBC_URL_PATTERN = Pattern.compile("jdbc:(?<db>\\w+):.*((//)|@)(?<host>.+):(?<port>\\d+).*");

    /**
     * 测试数据库是否可以正常连接
     *
     * @param url      地址
     * @param username 用户名
     * @param password 密码
     * @param driver   驱动
     * @return 是否成功 如果错误会返回错误信息
     */
    public static Optional<String> testConnection(String url, String username, String password, String driver) {
        try {
            // 加载驱动
            Class.forName(driver);
            // 获取连接
            Connection connection = DriverManager.getConnection(url, username, password);
            // 关闭连接
            connection.close();
            return Optional.empty();
        } catch (ClassNotFoundException classNotFoundException) {
            log.error("没有找到数据库驱动！", classNotFoundException);
            return Optional.of(StrUtil.format("没有找到数据库驱动 {} ！", driver));
        } catch (SQLException sqlException) {
            log.error("数据库连接失败！", sqlException);
            return Optional.of(sqlException.getMessage());
        }
    }

    /**
     * 从url中获取数据库名
     * 支持 mysql , sqlserver , oracle
     * @param url 链接地址
     * @return 数据库名
     */
    public static String getSchemeNameByUrl(String url){
        Matcher m = JDBC_URL_PATTERN.matcher(url);
        if (m.find()){
            return m.group("db");
        }
        return null;
    }


}
